The api.cheerio library has been removed
from the backend scripting API.
Scripts that attempt to use api.cheerio will
now throw an error with migration instructions.
cheerio was deprecated in v0.103.0 in favor
of api.htmlParser (node-html-parser),
which Trilium already uses for all of its own HTML parsing. The scripting
API was the only place that still needed cheerio.
Shipping both parsers was costly, because cheerio was
loaded at startup on every platform. It added roughly 1.35 MB of bundled
code to the server and desktop builds, and roughly 370 kB to the in-browser
build, where it was loaded into the database worker before the application
could start.
Replace api.cheerio calls with api.htmlParser.
Note that api.htmlParser returns plain elements
rather than a wrapped collection, so there is no $ object
and no chaining.
Before (cheerio):
const $ = api.cheerio.load(html);
const title = $('h1').text();
const links = $('a').map((i, el) => $(el).attr('href')).get();
After (htmlParser):
const root = api.htmlParser.parse(html);
const title = root.querySelector('h1')?.textContent;
const links = root.querySelectorAll('a').map(a => a.getAttribute('href'));
Before (cheerio):
const $ = api.cheerio.load(html);
$('a').each((i, el) => {
$(el).attr('href', '#root/' + noteId);
$(el).addClass('reference-link');
});
note.setContent($('body').html());
After (htmlParser):
const root = api.htmlParser.parse(html);
for (const el of root.querySelectorAll('a')) {
el.setAttribute('href', '#root/' + noteId);
el.classList.add('reference-link');
}
note.setContent(root.toString());
cheerio
|
htmlParser
|
|---|---|
api.cheerio.load(html)
|
api.htmlParser.parse(html)
|
$('sel')
|
root.querySelectorAll('sel')
|
$('sel').first()
|
root.querySelector('sel')
|
$el.text()
|
el.textContent
|
$el.html()
|
el.innerHTML
|
$el.attr('name')
|
el.getAttribute('name')
|
$el.attr('name', value)
|
el.setAttribute('name', value)
|
$el.addClass('name')
|
el.classList.add('name')
|
$('body').html()
|
root.toString()
|